/*
 * @LastEditors: qingmeijiupiao
 * @Description：屏幕UI还没写完,这版本能用（应该吧）
 * @Author: qingmeijiupiao
 * @Date: 2024-09-14 21:27:28
 */
/*
                                              .=%@#=.
                                            -*@@@@@@@#=.
                                         .+%@@@@@@@@@@@@#=
                                       -#@@@@@@@* =@@@@@@@@*:
                                     =%@@@@@@@@=   -@@@@@@@@@#-
                                  .+@@@@@@@@@@-     .@@@@@@@@@@%=
                                .+@@@@@@@@@@@@-     +@@@@@@@@@@@@@+.
                               +@@@@@@@@@@@@@@@    .@@@@@@@@@@@@@@@@+.
                             =@@@@@@@@@@@@@@@%-     =%@@%@@@@@@@@@@@@@=
                           -%@@@@@@@@@@@@+..     .       -@@@@@@@@@@@@@%-
                         .#@@@@@@@@@@@@@#       -@+       +@@@@@@@@@@@@@@#:
                        +@@@@@@@@@@@@@@@@+     +@@@+     =@@@@@@@@@@@@@@@@@+
                      :%@@@@@@@@@@@@@@@@@+    *@@@@*     =@@@@@@@@@@@@@@@@@@%-
                     +@@@@@@@@@@@@@@#+*+-   .#@@@@+       :+*+*@@@@@@@@@@@@@@@*
                   :%@@@@@@@@@@@@@@+       :%@@@@-    .-       -@@@@@@@@@@@@@@@%:
                  =@@@@@@@@@@@@@@@@-      -@@@@%:    .%@+      =@@@@@@@@@@@@@@@@@=
                 *@@@@@@@@@@@@@@@@@@.    =@@@@#.    -@@@@+    =@@@@@@@@@@@@@@@@@@@#
               .%@@@@@@@@@@@@@@@@@@+    +@@@@*     =@@@@%:    .#@@@@@@@@@@@@@@@@@@@%.
              :@@@@@@@@@@@@@@@%:::.    #@@@@+     +@@@@#        .::.*@@@@@@@@@@@@@@@@-
             -@@@@@@@@@@@@@@@%       .%@@@@=     *@@@@*     +-       *@@@@@@@@@@@@@@@@=
            =@@@@@@@@@@@@@@@@@#.    -@@@@@-    :%@@@@=    .#@@+     +@@@@@@@@@@@@@@@@@@=
           =@@@@@@@@@@@@@@@@@@@:    =====.     -+===:     :====     @@@@@@@@@@@@@@@@@@@@+
          +@@@@@@@@@@@@@@@#%%#-                                     :*%%#%@@@@@@@@@@@@@@@+
         =@@@@@@@@@@@@@@%.       ...........................              *@@@@@@@@@@@@@@@=
        =@@@@@@@@@@@@@@@+      .#@@@@@@@@@@@@@@@@@@@@@@@@@@#     .*:      =@@@@@@@@@@@@@@@@-
       -@@@@@@@@@@@@@@@@@=    .%@@@@@@@@@@@@@@@@@@@@@@@@@@#     :@@@-    =@@@@@@@@@@@@@@@@@@:
      :@@@@@@@@@@@@@@@@@%.   -@@@@%+=====================:     -@@@@%    :%@@@@@@@@@@@@@@@@@@.
      %@@@@@@@@@@@@@=-=:    =@@@@#.                           +@@@@#.      -=--%@@@@@@@@@@@@@%
     #@@@@@@@@@@@@@:       +@@@@*      ............. .       *@@@@*             %@@@@@@@@@@@@@+
    =@@@@@@@@@@@@@@#.     #@@@@+     +@@@@@@@@@@@@@@@#.    .#@@@@+     +#.     +@@@@@@@@@@@@@@@:
   .@@@@@@@@@@@@@@@@-   .%@@@@=     *@@@@@@@@@@@@@@@#     :%@@@@-     *@@%:    @@@@@@@@@@@@@@@@%
   %@@@@@@@@@@@%%%#=   :@@@@@:    .#@@@@+-----------     -@@@@@:     #@@@@=    :#%%%@@@@@@@@@@@@*
  =@@@@@@@@@@@=       -@@@@%.    :%@@@@-                =@@@@%.    .%@@@@=          :%@@@@@@@@@@@:
  @@@@@@@@@@@%.      =@@@@#     -@@@@%:    .:::-:      +@@@@#     :@@@@@:    .       +@@@@@@@@@@@#
 +@@@@@@@@@@@@@.    *@@@@*     =@@@@#.    -@@@@@:     #@@@@+     =@@@@%.    -@#     +@@@@@@@@@@@@@-
.@@@@@@@@@@@@@#    *@%@%=     +@@@@*     =@@@@#.    .#@@@%=     +@@@@#     =@@@%.   =@@@@@@@@@@@@@%
+@@@@@@@@*-==-                .          .           . ..       .....      .....     .=+=+@@@@@@@@@-
%@@@@@@@+                                                                                 -@@@@@@@@#
@@@@@@@-       =#%#=     -#%%#-     -#%%*.     +%%%*.    .*%%#=     :#%%#-     =%%%*.      .#@@@@@@@
@@@@@@=.::::::*@@@@@*:::-@@@@@@-:::=@@@@@%::::*@@@@@#::::%@@@@@+:---@@@@@@=---+@@@@@%------:=@@@@@@@
=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+
 *@@@@@@@@@@@@@@@@@@@@@@@@@@@%%##**++===----:::::------===++***##%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*
  -#@@@@@@@@@@@@@@@@%#*+=-:.                                        ..::-=+*##%@@@@@@@@@@@@@@@@@#-
    :=*%@@@@@%#*=-:                                                             .:-=+*#%%%%##+-.

          _____                   _______                   _____                    _____                _____
         /\    \                 /::\    \                 /\    \                  /\    \              /\    \
        /::\    \               /::::\    \               /::\____\                /::\    \            /::\    \
       /::::\    \             /::::::\    \             /:::/    /               /::::\    \           \:::\    \
      /::::::\    \           /::::::::\    \           /:::/    /               /::::::\    \           \:::\    \
     /:::/\:::\    \         /:::/~~\:::\    \         /:::/    /               /:::/\:::\    \           \:::\    \
    /:::/  \:::\    \       /:::/    \:::\    \       /:::/    /               /:::/__\:::\    \           \:::\    \
   /:::/    \:::\    \     /:::/    / \:::\    \     /:::/    /               /::::\   \:::\    \          /::::\    \
  /:::/    / \:::\    \   /:::/____/   \:::\____\   /:::/    /      _____    /::::::\   \:::\    \        /::::::\    \
 /:::/    /   \:::\    \ |:::|    |     |:::|    | /:::/____/      /\    \  /:::/\:::\   \:::\____\      /:::/\:::\    \
/:::/____/     \:::\____\|:::|____|     |:::|____||:::|    /      /::\____\/:::/  \:::\   \:::|    |    /:::/  \:::\____\
\:::\    \      \::/    / \:::\   _\___/:::/    / |:::|____\     /:::/    /\::/    \:::\  /:::|____|   /:::/    \::/    /
 \:::\    \      \/____/   \:::\ |::| /:::/    /   \:::\    \   /:::/    /  \/_____/\:::\/:::/    /   /:::/    / \/____/
  \:::\    \                \:::\|::|/:::/    /     \:::\    \ /:::/    /            \::::::/    /   /:::/    /
   \:::\    \                \::::::::::/    /       \:::\    /:::/    /              \::::/    /   /:::/    /
    \:::\    \                \::::::::/    /         \:::\__/:::/    /                \::/____/    \::/    /
     \:::\    \                \::::::/    /           \::::::::/    /                  ~~           \/____/
      \:::\    \                \::::/____/             \::::::/    /
       \:::\____\                |::|    |               \::::/    /
        \::/    /                |::|____|                \::/____/
         \/____/                  ~~                       ~~

*/
#include <Arduino.h>
#include <U8g2lib.h>
#include "PowerCtrl.hpp"
#include "Button.hpp"
#include "HXCthread.hpp"
// 屏幕对象
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0,U8X8_PIN_NONE,/*clk*/5,/*data*/4);

constexpr const int buttonPIN = 0;    // 定义按键端口
constexpr const int LEDPIN = 3;    // 定义LED端口
constexpr const int buzzer = 10;    // 定义蜂鸣器端口
constexpr const int volt_read_pin=1;    // 定义电池电压采样端口



Button emergency_button(buttonPIN,/*按下时的状态=*/LOW);


namespace Battery{
  float battery_voltage = 0;    // 电池电压
  float quantity = 0;    // 电池电量
  constexpr const float mini_voltage = 3.3;    // 电池最低电压
  // 电池电量检测线程
  HXC::thread<void> battery_check_thread
  ([](){
    while (true){
    battery_voltage = 2*analogReadMilliVolts(volt_read_pin)/1000.0;
    quantity = (battery_voltage-mini_voltage)/(4.2-mini_voltage);
    if(quantity<0){
      quantity = 0;
    }
    if(quantity>1){
      quantity = 1;
    }
    delay(1000);
  }
  });
}

// 屏幕任务还没写完
void screentask( void *pvParameters ) {
  u8g2.begin();

  while (true){
    
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_ncenB14_tr);
    u8g2.setCursor(4,20);
    u8g2.print(PowerCtrl::power_data.voltage);
    u8g2.print("V");
    u8g2.setCursor(4,45);
    u8g2.print(PowerCtrl::power_data.current);
    u8g2.print("A");
    
    u8g2.setCursor(4,60);
    if(digitalRead(buttonPIN)){
      u8g2.print("ON");
    }else{
      u8g2.print("OFF");
    }

    u8g2.setCursor(80,60);
    u8g2.print(int(Battery::quantity*100.f));
    u8g2.print("%");
    u8g2.sendBuffer(); 
    delay(100);
  }
}

// LED任务,由于作者板子的LED坏了又不想修,所以这个LED任务只是个简单的闪烁
HXC::thread<void> LEDThread([](){
  pinMode(LEDPIN, OUTPUT);
  digitalWrite(LEDPIN, HIGH);
  ledcAttachPin(LEDPIN, 3);
  ledcSetup(0, 5000, 8);
  while(1){
    for(int i=0;i<255;i++){
      ledcWrite(3,i);
      delay(5);
    }
    for(int i=0;i<255;i++){
      ledcWrite(3,255-i);
      delay(5);
    }
  }
});



void setup() 
{
  
  Serial.begin(115200);
  pinMode(buttonPIN, INPUT_PULLUP);

  // 功率计远程控制初始化
  PowerCtrl::setup();

  // 屏幕任务还没写完
  xTaskCreate(screentask, "screentask", 16384, NULL, 4, NULL);

  
  // 按下时关闭电源
  emergency_button.add_press_callback(PowerCtrl::power_off);

  // 释放时开启电源
  emergency_button.add_release_callback(PowerCtrl::power_on);

  // 急停按键初始化 
  emergency_button.setup();

  // 电池电量检测线程
  Battery::battery_check_thread.start();

  // LED线程
  LEDThread.start();//LED只是个简单的闪烁

  // 发送配对请求
  PowerCtrl::send_pair_package();

  // 请求功率计持续发送数据
  PowerCtrl::ctrl_send_data(/*continue=*/true,/*data rate=*/10);
}
 
void loop() {}
